/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cliente;

import ifs.RNClienteIF;
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
import java.net.SocketException;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.logging.Level;
import java.util.logging.Logger;
import rn.RNCliente;
import so.ArquivoUtil;
import so.Localizador;

/**
 *
 * @author italo
 */
public class ClienteMain {

    private static RNClienteIF rnCliente;

    public static void main(String[] args) {
        try {
            setUpEnvironment();
            setUpService();

            ArquivoUtil arquivoUtil = new ArquivoUtil();

            Localizador servidorLocalizador = arquivoUtil.getServidorLocalizador();

            rnCliente.realizaConexao(servidorLocalizador);

        } catch (NotBoundException ex) {
            Logger.getLogger(RNCliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MalformedURLException ex) {
            Logger.getLogger(RNCliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RemoteException ex) {
            Logger.getLogger(RNCliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SocketException ex) {
            Logger.getLogger(RNCliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(RNCliente.class.getName()).log(Level.SEVERE, null, ex);
        }


    }

    private static void setUpService() throws RemoteException, SocketException {
        rnCliente = new RNCliente();

        System.out.println("3 - Registrando o servico.");

        // com esse comando ele cria um registro e jah coloca no ar o programa
        Registry registry = LocateRegistry.createRegistry(rnCliente.getLocalizador().getPort());
        registry.rebind(rnCliente.getLocalizador().getServiceName(), rnCliente);

        System.out.println("4 - Cliente rodando em: " + rnCliente.getLocalizador());
    }

    private static void setUpEnvironment() {
        System.out.println("1 - Inicializando variaveis de ambiente.");

        String projectPath = System.getProperty("user.dir");

        // seta a propriedade que indica o arquivo de policy. Este arquivo determina a politica
        // de acesso das classes baixadas do servidor (em geral, os stubs) dentro do cliente
//        System.setProperty("java.security.policy", "file:" + projectPath + "/src/cliente.policy");
        System.setProperty("java.security.policy", "file:" + projectPath + "/cliente.policy");

        // permite o servidor exportar os stubs para o registry, disponibilizando-os para os clientes
//        System.setProperty("java.rmi.server.codebase", "file:" + projectPath + "/build/classes");
        System.setProperty("java.rmi.server.codebase", "file:" + projectPath );

        // seta o SecurityManager do sistema baseado no arquivo de policy acima.
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
        }

        System.out.println("2 - Variaveis de ambiente inicializadas.");
    }
}
